O que esperar das avaliações dos filmes do site GroupLens?

Vamos estimar, a partir de uma amostra de opiniões, os parâmetros da população de usuários do site de filmes GroupLens.

movies = read_csv("../dados/movies.csv")
ratings = read_csv("../dados/ratings.csv")
genres = read_csv("../dados/movie-genre.csv")
genres = genres %>%
  group_by(movieId, title) %>%
  summarise(nGenre = n())

O que esperar dos telespectadores em termos de avaliação de Resident Evil?

Ainda sobre o suscesso dos filmes de Resident Evil queremos saber o que esperar em termos de avaliação dos usuários do GroupLens. Quem são os usuários e como eles votam? Quais suas avaliações?

re_movies = movies %>% 
  filter(grepl("Resident Evil", title))

dados = merge(re_movies, ratings, by="movieId") %>%
  subset(select = -c(movieId, title, genres, timestamp))

Descritivo e decisões sobre filtrar dados ou variáveis

Antes de mais nada podemos nos perguntar: como se comporta a distribuição de avaliação de cada um dos usuários?

ggplotly(dados %>%
  ggplot(aes(x=as.character(userId),
             y=rating,
             color=as.character(userId))) +
  geom_jitter(width = .1) +
    geom_boxplot() +
  ggtitle("Distribuição da avaliação dos usuários") +
  ylab("Avaliação") +
  xlab("Usuário") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

Os gráficos acima mostram vários valores calculados a partir do conjunto de avaliações de cada usuário. Os quadrados ou box’s representam a distância interquartil (representam 50% das avaliações de cada episódio). As retas que cortam cada box são os valores de avaliação mediana para cada episódio.

Podemos observar no gráfico acima algumas coisas curiosas. A pior avaliação de Resident Evil foi do usuário de id 165 (0.5). As outras duas piores notas foram dos usuários 15 e 475 (1). Apenas dois usuários, 346 e 78, deram as notas mais altas (5).

Em termos de mediana de avaliação podemos observar duas coisas importantes no que compete a comparação: os usuários que melhor avaliaram e os que pior avaliaram. Apenas o usuário de Id 78 melhor avaliou os filmes (4.75), e apenas o usuário 475 pior avaliou os filmes (2).

ggplotly(dados %>%
           ggplot(aes(x=as.character(userId),
                      color=as.character(userId),
                      fill=as.character(userId))) +
           geom_bar(width = .5) +
  ggtitle("Distribuição da quantidade de avaliação dos usuários") +
    scale_y_continuous(breaks = seq(1,3,1)) +
  ylab("Quantidade") +
  xlab("Usuário") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

Em maioria os telespectadores votaram apenas uma vez e a quantidade máxima de avaliação observada é 3.

Estimando a avaliação dos telespectadores de Resident Evil

Qual seria a avaliação dos telespectadores de Resident Evil no site? Vamos estimar a mediana de avaliação populacional utilizando como métrica amostral a mediana de avaliação e a técnica de bootstrap.

A mediana é uma medida que não é afetada ou enviesada por valores extremos ou outliers isso irá deixar a análise mais justa. A técnica de bootstrap vai auxiliar no processo de re amostragem e cálculo do intervalo de confiança para a avaliação mediana. Iremos utilizar a 2000 replicações no processo de re amostragem e nível de confiança de 95%.

bootf <- function(x) {
    b =  bootstrap(x$rating, median, R = 2000)
    m = CI.percentile(b, probs = c(.025, .975))
    newstuff = rbind(m) %>%
      data.frame()
    return(newstuff)
}

dados.ci = dados %>%
  do(bootf(.)) %>%
  setNames(c("rating_lwr","rating_upr"))
dados.ci %>%
  ggplot(aes(x = "Usuários",
             ymin = rating_lwr,
             ymax = rating_upr,
             color=as.character("Usuários"))) + 
  geom_errorbar(width = .1) +
  labs(x="Usuário", y="Mediana de avaliação") +
  ggtitle("Intervalo de confiança da mediana de avaliação")+
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5))

Observando o gráfico acima podemos concluir com 95% de confiança que a mediana de avaliação populacional de telespectadores dos filmes de Resident Evil no site GroupLens está entre 2.5 e 3.5.

O que esperar dos telespectadores em termos de avaliação?

No tópico anterior estimamos a mediana de avaliação populacional dos telespectadores de Resident Evil e agora, de uma forma mais geral, vamos estimar a mediana de avaliação dos telespectadores de todos os filmes.

dados = ratings %>%
  subset(select = -c(movieId,timestamp))

Descritivo e decisões sobre filtrar dados ou variáveis

O conjunto de dados contém muitas avaliações para cada um dos usuários do GroupLens mas em que ordem de magnitude estão essas quantidades?

ggplotly(dados %>%
  ggplot(aes(x=as.character(userId),
             color=as.character(userId))) +
  geom_bar() +
  ggtitle("Distribuição da quantidade de avaliação dos usuários") +
  ylab("Quantidade de avaliações") +
  xlab("Usuário") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

A ordem de magnitude varia muito e vão de centenas até a casa de milhar. Alguns usuários avaliaram menos de 500 vezes enquanto que outros avaliaram mais de 2000 vezes. A quantidade máxima de avaliações (2391) é observada pelo usuário de Id 547. Este usuário não está sozinho, há outros 4 usuários que tamém se destacam bastante em quantidade de avaliações.

Estimando a avaliação dos telespectadores de todos os filmes

Qual seria a avaliação dos telespectadores de todos os filmes do site? Vamos estimar a avaliação dos filmes utilizando a mediana de avaliação e a técnica de bootstrap.

A mediana é uma medida que não é afetada ou enviesada por valores extremos ou outliers isso irá deixar a análise mais justa. A técnica de bootstrap vai auxiliar no processo de re amostragem e cálculo do intervalo de confiança para a avaliação mediana. Iremos utilizar a 2000 replicações no processo de re amostragem e nível de confiança de 95%.

dados.ci = dados %>%
  do(bootf(.)) %>%
  setNames(c("rating_lwr","rating_upr"))

dados.ci %>%
  ggplot(aes(x = "Usuários",
             ymin = rating_lwr,
             ymax = rating_upr,
             color="Usuários")) + 
  geom_errorbar(width = .1) +
  labs(x="Usuário", y="Mediana de avaliação") +
  ggtitle("Intervalo de confiança da mediana de avaliação")+
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5))

Observando o gráfico acima podemos concluir com 95% de confiança que a mediana de avaliação populacional de telespectadores de todos os filmes do site GroupLens é 4.

O que esperar dos telespectadores em termos de avaliação dos gêneros de filmes?

Será que existe um gênero preferido dos telespectadores? Quais os gêneros mais bem avaliados dos filmes do GroupLens? Quais os gêneros e como eles são votados? Quais suas avaliações? Vamos estimar a mediana de avaliação populacional dos usuários do site GroupLens dos dois gêneros mais votados.

genres = read_csv("../dados/movie-genre.csv")
dados = merge(genres, ratings, by="movieId") %>%
  subset(select = -c(movieId, title, userId, timestamp))

Descritivo e decisões sobre filtrar dados ou variáveis

Inicialmente há algumas avaliações associadas a filmes que não contém gênero. Estas avaliações serão filtradas.

dados = dados %>% filter(genre != "(no genres listed)")

O conjunto de dados contém muitas avaliações para cada um dos gêneros dos filmes do GroupLens mas em que ordem de magnitude estão essas quantidades?

ggplotly(dados %>%
  ggplot(aes(x=genre,
             color=genre,
             fill=genre)) +
  geom_bar() +
  ggtitle("Distribuição da quantidade de avaliação dos gêneros") +
  ylab("Quantidade de avaliações") +
  xlab("Gênero") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

A ordem de magnitude varia muito na casa de milhar. Alguns gêneros foram avaliados menos de 10000 vezes enquanto que outros foram mais de 30000 vezes. A quantidade máxima de avaliações (43684) é observada pelo gênero de drama. Este gênero não está sozinho e é acompanhado por outros 3 gêneros que tamém se destacam bastante em quantidade de avaliações.

Observando agora apenas os gêneros de drama e comédia: como se comportam a distribuição de avaliações desses gêneros?

dados = dados %>% 
  filter(genre %in% c("Comedy", "Drama"))

ggplotly(dados %>%
  ggplot(aes(x=genre,
             y=rating,
             color=genre)) +
    geom_boxplot() +
  ggtitle("Distribuição da avaliação dos gêneros") +
  ylab("Avaliação") +
  xlab("Gênero") +
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5)))

Observando o gráfico acima podemos observar que além de ser o gênero que contém mais avaliações, o gênero de drama é também o gênero que contém maior avaliação em termos de mediana (4).

Estimando a avaliação dos telespectadores dos filmes de comédia e drama

Qual seria a avaliação dos telespectadores dos filmes de comédia e drama? Vamos estimar a avaliação dos gêneros utilizando a mediana de avaliação e a técnica de bootstrap.

A mediana é uma medida que não é afetada ou enviesada por valores extremos ou outliers, isso irá deixar a análise mais justa. A técnica de bootstrap vai auxiliar no processo de re amostragem e cálculo do intervalo de confiança para a avaliação mediana. Iremos utilizar a 2000 replicações no processo de re amostragem e nível de confiança de 95%.

dados.ci = dados %>%
  group_by(genre) %>%
  do(bootf(.)) %>%
  setNames(c("genre","rating_lwr","rating_upr"))

Qual seria a expectativa de mediana de avaliação para cada um dos gêneros listados acima?

dados.ci %>%
  ggplot(aes(x = genre,
             ymin = rating_lwr,
             ymax = rating_upr,
             color= genre)) + 
  geom_errorbar(width = .1) +
  labs(x="Gênero",
       y="Mediana de avaliação") +
  ggtitle("Intervalo de confiança da mediana de avaliação de cada gênero")+
  theme(legend.position="none",
        plot.title = element_text(hjust = 0.5))

Observando o gráfico acima podemos concluir com 95% de confiança que a mediana de avaliação populacional do gênero comédia dos telespectadores de todos os filmes do site GroupLens é 3.5 e que a mediana de avaliação para a mesma população do gênero drama é 4.